library(vegan)
library(broom)
library(MASS)
library(tidyverse)
## Do Not Run
#wExp <- readRDS("~/RMB/SoilDomestication/Data/wExp.rds")
#wExp %>% 
#  filter(Site == "Arkansas") %>% 
#  ungroup() %>% 
#  saveRDS("~/RMB/SoilDomestication/Data/native_plants_data.rds")
nExp <- readRDS("~/RMB/SoilDomestication/Data/native_plants_data.rds") %>% filter(SampleID != "Arw.22")
tax <- readRDS("~/RMB/SoilDomestication/Data/gg_otus_tax.rds")
long_pcoa <- function(x, samples = "SampleID", otus = "variable", value = "RA", dist = "bray"){
  to_drop <- otus
  metadata <- x %>% 
    dplyr::ungroup() %>% 
    purrr::discard(is.double) %>% 
    dplyr::select_(.dots = paste("-", to_drop)) %>% 
    dplyr::distinct()
  
  wide_table <- x %>% 
    dplyr::select_(samples, otus, value) %>% 
    tidyr::spread_(otus, value, fill = 0)
  
  pc <- vegan::capscale(log2(wide_table[,2:ncol(wide_table)] + 1) ~ 1, dist = dist)
  axes <- dplyr::bind_cols(metadata, dplyr::as_tibble(vegan::scores(pc, choices = c(1:5))$sites))
  eigen_vals <- vegan::eigenvals(pc) / sum(vegan::eigenvals(pc))
  
  return(list(axes = axes, eigen_vals = eigen_vals))
}
raref <- function(x, sampling_depth, value = "value", otus = "variable") {
  rare_values <- data.frame(table(sample(x$`variable`, sampling_depth, replace = T, prob = x$`value`/x$depth)))
  names(rare_values) <- c(otus, "rare_value")
  return(suppressMessages(left_join(x, rare_values, by = otus) %>% replace_na(list(rare_value = 0))))
}
long_adonis <- function(x, samples = "SampleID", otus = "variable", value = "RA", dist = "bray", formula) {
    to_drop <- otus
    metadata <- x %>% 
        dplyr::ungroup() %>% 
        purrr::discard(is.double) %>% 
        dplyr::select_(.dots = paste("-", to_drop)) %>% 
        dplyr::distinct()
  
    wide_table <- x %>% 
        dplyr::select_(samples, otus, value) %>% 
        tidyr::spread_(otus, value, fill = 0)
    permanova <- vegan::adonis(as.formula(paste("wide_table[,2:ncol(wide_table)] ~ ", formula, sep = "")), data = metadata, dist = dist)
    return(permanova)
}

Phyla Stuff

Differential Abundance

pois_glm %>% 
  unnest(map(models, ~tidy(.))) %>% 
  mutate(p.adj = p.adjust(p.value, "fdr")) %>% 
  filter(term != "(Intercept)") %>% 
  mutate(direction = ifelse(estimate > 0, "Weed", "Rice")) %>% 
  filter(p.adj <= 0.05) %>% 
  group_by(Compartment, direction, variable) %>% 
  summarise(n = n()) %>% 
  group_by(Compartment, direction) %>% 
  mutate(total = n()) %>% 
  filter(n == 3) %>% 
  group_by(Compartment, direction, total) %>% 
  summarise(n = n())
nb_glm %>% 
  unnest(map(models, ~tidy(.))) %>% 
  mutate(p.adj = p.adjust(p.value, "fdr")) %>% 
  filter(term != "(Intercept)") %>% 
  mutate(direction = ifelse(estimate > 0, "Weed", "Rice")) %>% 
  filter(p.adj <= 0.05) %>% 
  group_by(Compartment, direction, variable) %>% 
  summarise(n = n()) %>% 
  group_by(Compartment, direction) %>% 
  mutate(total = n()) %>% 
  filter(n == 3) %>% 
  group_by(Compartment, direction, total) %>% 
  summarise(n = n())
plant_lm %>% 
  unnest(map(models, ~tidy(.))) %>% 
  mutate(p.adj = p.adjust(p.value, "fdr")) %>% 
  filter(term != "(Intercept)") %>% 
  mutate(direction = ifelse(estimate > 0, "Weed", "Rice")) %>% 
  filter(p.adj <= 0.05) %>% 
  group_by(Compartment, direction, variable) %>% 
  summarise(n = n()) %>% 
  group_by(Compartment, direction) %>% 
  mutate(total = n()) %>% 
  filter(n == 3) %>% 
  group_by(Compartment, direction, total) %>% 
  summarise(n = n())

nExp2 %>% 
  filter(variable == "1110462" & Compartment == "Rhizosphere") %>% 
  ggplot(aes(host_common_name, rare_value, color = host_common_name)) +
  geom_jitter(height = 0, width = 0.1)
tax["1091625",]
LS0tCnRpdGxlOiAiTmF0aXZlIFBsYW50cyBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodmVnYW4pCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoTUFTUykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYnJvb20pCmBgYAoKYGBge3J9CiMjIERvIE5vdCBSdW4KI3dFeHAgPC0gcmVhZFJEUygifi9STUIvU29pbERvbWVzdGljYXRpb24vRGF0YS93RXhwLnJkcyIpCiN3RXhwICU+JSAKIyAgZmlsdGVyKFNpdGUgPT0gIkFya2Fuc2FzIikgJT4lIAojICB1bmdyb3VwKCkgJT4lIAojICBzYXZlUkRTKCJ+L1JNQi9Tb2lsRG9tZXN0aWNhdGlvbi9EYXRhL25hdGl2ZV9wbGFudHNfZGF0YS5yZHMiKQoKbkV4cCA8LSByZWFkUkRTKCJ+L1JNQi9Tb2lsRG9tZXN0aWNhdGlvbi9EYXRhL25hdGl2ZV9wbGFudHNfZGF0YS5yZHMiKSAlPiUgZmlsdGVyKFNhbXBsZUlEICE9ICJBcncuMjIiKSAlPiUgCiAgbXV0YXRlKGNwbSA9IHJvdW5kKHZhbHVlICogKDEwMDAwMDAgLyBkZXB0aCkpKQp0YXggPC0gcmVhZFJEUygifi9STUIvU29pbERvbWVzdGljYXRpb24vRGF0YS9nZ19vdHVzX3RheC5yZHMiKQpgYGAKCmBgYHtyfQpsb25nX3Bjb2EgPC0gZnVuY3Rpb24oeCwgc2FtcGxlcyA9ICJTYW1wbGVJRCIsIG90dXMgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJSQSIsIGRpc3QgPSAiYnJheSIpewogIHRvX2Ryb3AgPC0gb3R1cwogIG1ldGFkYXRhIDwtIHggJT4lIAogICAgZHBseXI6OnVuZ3JvdXAoKSAlPiUgCiAgICBwdXJycjo6ZGlzY2FyZChpcy5kb3VibGUpICU+JSAKICAgIGRwbHlyOjpzZWxlY3RfKC5kb3RzID0gcGFzdGUoIi0iLCB0b19kcm9wKSkgJT4lIAogICAgZHBseXI6OmRpc3RpbmN0KCkKICAKICB3aWRlX3RhYmxlIDwtIHggJT4lIAogICAgZHBseXI6OnNlbGVjdF8oc2FtcGxlcywgb3R1cywgdmFsdWUpICU+JSAKICAgIHRpZHlyOjpzcHJlYWRfKG90dXMsIHZhbHVlLCBmaWxsID0gMCkKICAKICBwYyA8LSB2ZWdhbjo6Y2Fwc2NhbGUobG9nMih3aWRlX3RhYmxlWywyOm5jb2wod2lkZV90YWJsZSldICsgMSkgfiAxLCBkaXN0ID0gZGlzdCkKICBheGVzIDwtIGRwbHlyOjpiaW5kX2NvbHMobWV0YWRhdGEsIGRwbHlyOjphc190aWJibGUodmVnYW46OnNjb3JlcyhwYywgY2hvaWNlcyA9IGMoMTo1KSkkc2l0ZXMpKQogIGVpZ2VuX3ZhbHMgPC0gdmVnYW46OmVpZ2VudmFscyhwYykgLyBzdW0odmVnYW46OmVpZ2VudmFscyhwYykpCiAgCiAgcmV0dXJuKGxpc3QoYXhlcyA9IGF4ZXMsIGVpZ2VuX3ZhbHMgPSBlaWdlbl92YWxzKSkKfQoKcmFyZWYgPC0gZnVuY3Rpb24oeCwgc2FtcGxpbmdfZGVwdGgsIHZhbHVlID0gInZhbHVlIiwgb3R1cyA9ICJ2YXJpYWJsZSIpIHsKICByYXJlX3ZhbHVlcyA8LSBkYXRhLmZyYW1lKHRhYmxlKHNhbXBsZSh4JGB2YXJpYWJsZWAsIHNhbXBsaW5nX2RlcHRoLCByZXBsYWNlID0gVCwgcHJvYiA9IHgkYHZhbHVlYC94JGRlcHRoKSkpCiAgbmFtZXMocmFyZV92YWx1ZXMpIDwtIGMob3R1cywgInJhcmVfdmFsdWUiKQogIHJldHVybihzdXBwcmVzc01lc3NhZ2VzKGxlZnRfam9pbih4LCByYXJlX3ZhbHVlcywgYnkgPSBvdHVzKSAlPiUgcmVwbGFjZV9uYShsaXN0KHJhcmVfdmFsdWUgPSAwKSkpKQp9Cgpsb25nX2Fkb25pcyA8LSBmdW5jdGlvbih4LCBzYW1wbGVzID0gIlNhbXBsZUlEIiwgb3R1cyA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gIlJBIiwgZGlzdCA9ICJicmF5IiwgZm9ybXVsYSkgewoJdG9fZHJvcCA8LSBvdHVzCiAJbWV0YWRhdGEgPC0geCAlPiUgCgkJZHBseXI6OnVuZ3JvdXAoKSAlPiUgCgkJcHVycnI6OmRpc2NhcmQoaXMuZG91YmxlKSAlPiUgCgkJZHBseXI6OnNlbGVjdF8oLmRvdHMgPSBwYXN0ZSgiLSIsIHRvX2Ryb3ApKSAlPiUgCgkJZHBseXI6OmRpc3RpbmN0KCkKICAKCXdpZGVfdGFibGUgPC0geCAlPiUgCgkJZHBseXI6OnNlbGVjdF8oc2FtcGxlcywgb3R1cywgdmFsdWUpICU+JSAKCQl0aWR5cjo6c3ByZWFkXyhvdHVzLCB2YWx1ZSwgZmlsbCA9IDApCgoJcGVybWFub3ZhIDwtIHZlZ2FuOjphZG9uaXMoYXMuZm9ybXVsYShwYXN0ZSgid2lkZV90YWJsZVssMjpuY29sKHdpZGVfdGFibGUpXSB+ICIsIGZvcm11bGEsIHNlcCA9ICIiKSksIGRhdGEgPSBtZXRhZGF0YSwgZGlzdCA9IGRpc3QpCglyZXR1cm4ocGVybWFub3ZhKQp9CmBgYAoKCmBgYHtyfSAKblBDIDwtIGxvbmdfcGNvYShuRXhwICU+JSBncm91cF9ieSh2YXJpYWJsZSkgJT4lIGZpbHRlcihzdW0odmFsdWUpID4gMCkgJT4lIG11dGF0ZShSQSA9IFJBKjEwMDApLCBkaXN0ID0gImJyYXkiLCB2YWx1ZSA9ICJSQSIpCm5QQyRheGVzICU+JSAKICBnZ3Bsb3QoYWVzKE1EUzEsIE1EUzIsIGNvbG9yID0gaG9zdF9jb21tb25fbmFtZSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuNykgKwogIHN0YXRfZWxsaXBzZShhZXMoZ3JvdXAgPSBDb21wYXJ0bWVudCksIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gcGFzdGUoIlBDbzEgKCIsIHJvdW5kKG5QQyRlaWdlbl92YWxzWzFdICogMTAwLCAyKSwgIiUpIiwgc2VwID0gIiIpLCB5ID0gcGFzdGUoIlBDbzIgKCIsIHJvdW5kKG5QQyRlaWdlbl92YWxzWzJdICogMTAwLCAyKSwgIiUpIiwgc2VwID0gIiIpKQpgYGAKYGBge3J9CmxvbmdfYWRvbmlzKG5FeHAgJT4lIG11dGF0ZShSQTIgPSBsb2cyKChSQSoxMDAwKSArIDEpKSwgdmFsdWUgPSAiUkEyIiwgZm9ybXVsYSA9ICJDb21wYXJ0bWVudCAqIGhvc3RfY29tbW9uX25hbWUiKQpuRXhwICU+JSAKICBtdXRhdGUoUkEyID0gbG9nMigoUkEqMTAwMCkgKyAxKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50KSAlPiUgCiAgbmVzdCgpICU+JSAKICBmaWx0ZXIoQ29tcGFydG1lbnQgIT0gIkJ1bGsgU29pbCIpICU+JSAKICBtdXRhdGUoYWQgPSBtYXAoZGF0YSwgfmxvbmdfYWRvbmlzKC4sIHZhbHVlID0gIlJBMiIsIGZvcm11bGEgPSAiaG9zdF9jb21tb25fbmFtZSIpKSkKYGBgCgojIyBQaHlsYSBTdHVmZgpgYGB7cn0KcGh5bGFfYWJ1bmQgPC0gbkV4cCAlPiUgCiAgaW5uZXJfam9pbih0YXgsIGJ5ID0gInZhcmlhYmxlIikgJT4lIAogIGdyb3VwX2J5KFNhbXBsZUlELCBDb21wYXJ0bWVudCwgaG9zdF9jb21tb25fbmFtZSwgUGh5bHVtMiwgZGVwdGgpICU+JSAKICBzdW1tYXJpc2UocGh5X3RvdGFsID0gc3VtKHZhbHVlKSkgJT4lIAogIG11dGF0ZShwcm9wID0gKHBoeV90b3RhbCArIDEpIC8gKGRlcHRoICsgMSkpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCkgJT4lIAogIG11dGF0ZShhbHBoYSA9IGZpdGRpc3RyKHByb3AsIGRiZXRhLCBzdGFydCA9IGxpc3Qoc2hhcGUxID0gMSwgc2hhcGUyID0gMTApKSRlc3RpbWF0ZVsxXSwKICAgICAgICAgYmV0YSA9IGZpdGRpc3RyKHByb3AsIGRiZXRhLCBzdGFydCA9IGxpc3Qoc2hhcGUxID0gMSwgc2hhcGUyID0gMTApKSRlc3RpbWF0ZVsyXSkgJT4lIAogIG11dGF0ZShlbXBfZXN0aW1hdGUgPSAocGh5X3RvdGFsICsgYWxwaGEgKyAxKSAvIChkZXB0aCArIDEgKyBhbHBoYSArIGJldGEpKQoKcGh5X2hvc3RfbG0gPC0gcGh5bGFfYWJ1bmQgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBQaHlsdW0yKSAlPiUgCiAgZmlsdGVyKGhvc3RfY29tbW9uX25hbWUgIT0gIlNvaWwiKSAlPiUgCiAgbXV0YXRlKGhvc3RfY29tbW9uX25hbWUgPSBmY3RfcmVsZXZlbChob3N0X2NvbW1vbl9uYW1lLCAiUmljZSIsICJSZWRzdGVtIiwgIlNlZGdlIiwgIk11ZHBsYW50YWluIikpICU+JSAKICBuZXN0KCkgJT4lIAogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfnRpZHkobG0obG9nMihlbXBfZXN0aW1hdGUpIH4gaG9zdF9jb21tb25fbmFtZSwgLikpKSkgJT4lIAogIHVubmVzdChtb2RlbHMpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgbXV0YXRlKHRlcm0gPSBnc3ViKCJob3N0X2NvbW1vbl9uYW1lIiwgIiIsIHRlcm0pKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiZmRyIikpCgpwaHlfaG9zdF9sbTEgPC0gcGh5bGFfYWJ1bmQgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBQaHlsdW0yKSAlPiUgCiAgZmlsdGVyKGhvc3RfY29tbW9uX25hbWUgIT0gIlNvaWwiKSAlPiUgCiAgbXV0YXRlKGhvc3RfY29tbW9uX25hbWUgPSBmY3RfcmVsZXZlbChob3N0X2NvbW1vbl9uYW1lLCAiUmljZSIsICJSZWRzdGVtIiwgIlNlZGdlIiwgIk11ZHBsYW50YWluIikpICU+JSAKICBuZXN0KCkgJT4lIAogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfnRpZHkobG0obG9nMihwaHlfdG90YWwgKyAxKSB+IGhvc3RfY29tbW9uX25hbWUsIC4pKSkpICU+JSAKICB1bm5lc3QobW9kZWxzKSAlPiUgCiAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lIAogIG11dGF0ZSh0ZXJtID0gZ3N1YigiaG9zdF9jb21tb25fbmFtZSIsICIiLCB0ZXJtKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50KSAlPiUgCiAgbXV0YXRlKHAuYWRqID0gcC5hZGp1c3QocC52YWx1ZSwgImZkciIpKQoKcGh5X2NvbXBfbG0gPC0gcGh5bGFfYWJ1bmQgJT4lIAogIGdyb3VwX2J5KFBoeWx1bTIpICU+JSAKICBuZXN0KCkgJT4lIAogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfnRpZHkobG0obG9nMihlbXBfZXN0aW1hdGUpIH4gQ29tcGFydG1lbnQsIC4pKSkpICU+JSAKICB1bm5lc3QobW9kZWxzKSAlPiUgCiAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lIAogIG11dGF0ZSh0ZXJtID0gZ3N1YigiQ29tcGFydG1lbnQiLCAiIiwgdGVybSkpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiYm9uIikpCgpwaHlfY29tcF9sbSAlPiUgCiAgZmlsdGVyKHAuYWRqIDw9IDAuMDUpICU+JSAKICBtdXRhdGUoUGh5bHVtMiA9IGZjdF9yZW9yZGVyKGZhY3RvcihQaHlsdW0yKSwgZXN0aW1hdGUpKSAlPiUgCiAgZ2dwbG90KGFlcyhQaHlsdW0yLCBlc3RpbWF0ZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X2dyaWQoLiB+IHRlcm0pCgpwaHlfY29tcF9sbSAlPiUgCiAgaW5uZXJfam9pbihwaHlsYV9hYnVuZCAlPiUgZ3JvdXBfYnkoUGh5bHVtMiwgQ29tcGFydG1lbnQpICU+JSBzdW1tYXJpc2UobWVhbl9hYiA9IG1lYW4oZW1wX2VzdGltYXRlKSksIGJ5ID0gYyhjKCJ0ZXJtIiA9ICJDb21wYXJ0bWVudCIpLCAiUGh5bHVtMiIpKSAlPiUgCiAgbXV0YXRlKENvbXBhcnRtZW50ID0gZmN0X3JlbGV2ZWwodGVybSwgIlJoaXpvc3BoZXJlIiwgIkVuZG9zcGhlcmUiKSkgJT4lCiAgZ2dwbG90KGFlcyhDb21wYXJ0bWVudCwgZXN0aW1hdGUsIGdyb3VwID0gUGh5bHVtMiwgY29sb3IgPSBpZmVsc2UocC5hZGogPD0gMC4wNSwgQ29tcGFydG1lbnQsICJucyIpLCBzaGFwZSA9IGlmZWxzZShwLmFkaiA8PSAwLjA1LCAic2lnIiwgIm5zIiksIHNpemUgPSBsb2cyKG1lYW5fYWIgKiAxMDAwKSkpICsKICBnZW9tX2xpbmUoY29sb3IgPSAnYmxhY2snLCBhbHBoYSA9IDAuNSwgc2l6ZSA9IDAuNSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxLCAxNikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya21hZ2VudGEiLCAic3RlZWxibHVlIiwgImJsYWNrIikpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsMTApKSArCiAgdGhlbWVfbWluaW1hbCgpCgpwaHlfaG9zdF9sbSAlPiUgCiAgZmlsdGVyKHAuYWRqIDw9IDAuMDUpICU+JSB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShDb21wYXJ0bWVudCA9IGZjdF9yZWxldmVsKENvbXBhcnRtZW50LCAiUmhpem9zcGhlcmUiLCAiRW5kb3NwaGVyZSIpKSAlPiUgCiAgZ2dwbG90KGFlcyhQaHlsdW0yLCB0ZXJtLCBmaWxsID0gZXN0aW1hdGUpKSArCiAgZ2VvbV90aWxlKCkgKwogIGZhY2V0X2dyaWQoQ29tcGFydG1lbnR+LikgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJnb2xkIiwgaGlnaCA9ICJkb2RnZXJibHVlIiwgbWlkID0gJ2JsYWNrJykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpCiAgCnBoeWxhX2FidW5kICU+JSAKICBncm91cF9ieShQaHlsdW0yKSAlPiUgCiAgbmVzdCgpICU+JSAKICBtdXRhdGUodG90YWwgPSBtYXBfZGJsKGRhdGEsIH5zdW0oLngkcHJvcCkpKSAlPiUgCiAgdG9wX24oMTUsIHRvdGFsKSAlPiUgCiAgdW5uZXN0KGRhdGEpICU+JSAKICBtdXRhdGUoQ29tcGFydG1lbnQgPSBmY3RfcmVsZXZlbChDb21wYXJ0bWVudCwgIkJ1bGsgU29pbCIsICJSaGl6b3NwaGVyZSIsICJFbmRvc3BoZXJlIikpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCwgaG9zdF9jb21tb25fbmFtZSwgU2FtcGxlSUQpICU+JSAKICBuZXN0KCkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50KSAlPiUgCiAgYXJyYW5nZShob3N0X2NvbW1vbl9uYW1lKSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gMTpuKCkpICU+JSAKICB1bm5lc3QoKSAlPiUgCiAgZ2dwbG90KGFlcyhvcmRlciwgcHJvcCAqIDEwMCwgZmlsbCA9IFBoeWx1bTIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gb3JkZXIsIHkgPSAtMiwgY29sb3IgPSBob3N0X2NvbW1vbl9uYW1lKSkgKwogIGZhY2V0X2dyaWQoLn5Db21wYXJ0bWVudCwgc2NhbGVzID0gImZyZWVfeCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKGJyZXdlci5wYWwoMTEsICJSZEd5IiksYnJld2VyLnBhbCg1LCAiQmx1ZXMiKVstMV0pKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiUGVyY2VudCBvZiBSZWFkcyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCiMjIERpZmZlcmVudGlhbCBBYnVuZGFuY2UKYGBge3J9CnNhZmVfZ2xtIDwtIHBvc3NpYmx5KGdsbSwgTkFfcmVhbF8pCnNhZmVfZ2xtLm5iIDwtIHBvc3NpYmx5KGdsbS5uYiwgTkFfcmVhbF8pCgpuRXhwMiA8LSBuRXhwICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSh2YXJpYWJsZSA9IGZhY3Rvcih2YXJpYWJsZSkpICU+JSAKICBncm91cF9ieShTYW1wbGVJRCkgJT4lIAogIG5lc3QoKSAlPiUgCiAgbXV0YXRlKHJhcmUgPSBtYXAoZGF0YSwgfnJhcmVmKC4sIHNhbXBsaW5nX2RlcHRoID0gMTUwMDAsIHZhbHVlID0gInZhbHVlIikpKSAlPiUgCiAgdW5uZXN0KHJhcmUpCgpwb2lzX2dsbSA8LSBuRXhwMiAlPiUgCiAgZmlsdGVyKENvbXBhcnRtZW50ICE9ICJCdWxrIFNvaWwiKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JSAKICBmaWx0ZXIoc3VtKHJhcmVfdmFsdWUgPiAwKSAvIG4oKSA+IDAuMSkgJT4lIAogIG11dGF0ZShob3N0X2NvbW1vbl9uYW1lID0gcmVsZXZlbChmYWN0b3IoaG9zdF9jb21tb25fbmFtZSksIHJlZiA9ICJSaWNlIikpICU+JSAKICBncm91cF9ieSh2YXJpYWJsZSwgQ29tcGFydG1lbnQpICU+JSAKICBuZXN0KCkgJT4lCiAgbXV0YXRlKG1vZGVscyA9IG1hcChkYXRhLCB+c3VwcHJlc3NXYXJuaW5ncyhzYWZlX2dsbS5wb2lzKHJhcmVfdmFsdWUgfiBob3N0X2NvbW1vbl9uYW1lICsgb2Zmc2V0KGxvZzIoZGVwdGgpKSwgZmFtaWx5ID0gcG9pc3NvbiwgLikpKSkKCm5iX2dsbSA8LSBuRXhwMiAlPiUgCiAgZmlsdGVyKENvbXBhcnRtZW50ICE9ICJCdWxrIFNvaWwiKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JSAKICBmaWx0ZXIoc3VtKHJhcmVfdmFsdWUgPiAwKSAvIG4oKSA+IDAuMSkgJT4lIAogIG11dGF0ZShob3N0X2NvbW1vbl9uYW1lID0gcmVsZXZlbChmYWN0b3IoaG9zdF9jb21tb25fbmFtZSksIHJlZiA9ICJSaWNlIikpICU+JSAKICBncm91cF9ieSh2YXJpYWJsZSwgQ29tcGFydG1lbnQpICU+JSAKICBuZXN0KCkgJT4lCiAgbXV0YXRlKG1vZGVscyA9IG1hcChkYXRhLCB+c3VwcHJlc3NXYXJuaW5ncyhzYWZlX2dsbS5uYihyYXJlX3ZhbHVlIH4gaG9zdF9jb21tb25fbmFtZSArIG9mZnNldChsb2cyKGRlcHRoKSksIC4pKSkpCgpwbGFudF9sbSA8LSBuRXhwICU+JSAKICBmaWx0ZXIoQ29tcGFydG1lbnQgIT0gIkJ1bGsgU29pbCIpICU+JSAKICBncm91cF9ieSh2YXJpYWJsZSkgJT4lIAogIGZpbHRlcihzdW0oY3BtID4gMCkgLyBuKCkgPiAwLjEpICU+JSAKICBtdXRhdGUoaG9zdF9jb21tb25fbmFtZSA9IHJlbGV2ZWwoZmFjdG9yKGhvc3RfY29tbW9uX25hbWUpLCByZWYgPSAiUmljZSIpKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUsIENvbXBhcnRtZW50KSAlPiUgCiAgbmVzdCgpICU+JQogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfmxtKGxvZzIoKFJBICogMTAwMCkgKyAxKSB+IGhvc3RfY29tbW9uX25hbWUsIC4pKSkKYGBgCgpgYGB7cn0KcG9pc19nbG0gJT4lIAogIHVubmVzdChtYXAobW9kZWxzLCB+dGlkeSguKSkpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiZmRyIikpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgbXV0YXRlKGRpcmVjdGlvbiA9IGlmZWxzZShlc3RpbWF0ZSA+IDAsICJXZWVkIiwgIlJpY2UiKSkgJT4lIAogIGZpbHRlcihwLmFkaiA8PSAwLjA1KSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdmFyaWFibGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBkaXJlY3Rpb24pICU+JSAKICBtdXRhdGUodG90YWwgPSBuKCkpICU+JSAKICBmaWx0ZXIobiA9PSAzKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdG90YWwpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkKCm5iX2dsbSAlPiUgCiAgdW5uZXN0KG1hcChtb2RlbHMsIH50aWR5KC4pKSkgJT4lIAogIG11dGF0ZShwLmFkaiA9IHAuYWRqdXN0KHAudmFsdWUsICJmZHIiKSkgJT4lIAogIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSAKICBtdXRhdGUoZGlyZWN0aW9uID0gaWZlbHNlKGVzdGltYXRlID4gMCwgIldlZWQiLCAiUmljZSIpKSAlPiUgCiAgZmlsdGVyKHAuYWRqIDw9IDAuMDUpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCwgZGlyZWN0aW9uLCB2YXJpYWJsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbikgJT4lIAogIG11dGF0ZSh0b3RhbCA9IG4oKSkgJT4lIAogIGZpbHRlcihuID09IDMpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCwgZGlyZWN0aW9uLCB0b3RhbCkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKQoKcGxhbnRfbG0gJT4lIAogIHVubmVzdChtYXAobW9kZWxzLCB+dGlkeSguKSkpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiZmRyIikpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgbXV0YXRlKGRpcmVjdGlvbiA9IGlmZWxzZShlc3RpbWF0ZSA+IDAsICJXZWVkIiwgIlJpY2UiKSkgJT4lIAogIGZpbHRlcihwLmFkaiA8PSAwLjA1KSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdmFyaWFibGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBkaXJlY3Rpb24pICU+JSAKICBtdXRhdGUodG90YWwgPSBuKCkpICU+JSAKICBmaWx0ZXIobiA9PSAzKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdG90YWwpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkKYGBgCgpgYGB7cn0KCm5FeHAyICU+JSAKICBmaWx0ZXIodmFyaWFibGUgPT0gIjExMTA0NjIiICYgQ29tcGFydG1lbnQgPT0gIlJoaXpvc3BoZXJlIikgJT4lIAogIGdncGxvdChhZXMoaG9zdF9jb21tb25fbmFtZSwgcmFyZV92YWx1ZSwgY29sb3IgPSBob3N0X2NvbW1vbl9uYW1lKSkgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAsIHdpZHRoID0gMC4xKQp0YXhbIjEwOTE2MjUiLF0KYGBgCgo=